#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
const int M = 26;

inline int qread(int& x){
	x=0;
    int f=1;
    char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

int n,m;
int arr[N];
int maxn[N][M];
int log_2[N];
int l,r,res;

int main(){
    qread(n);
    qread(m);
    log_2[1] = 0;
    memset(maxn,0,sizeof(maxn));
    for(int i=1;i<=n;i++){
        qread(arr[i]);
        maxn[i][0] = arr[i];
        if(i>=2){
            log_2[i] = log_2[i-1]+((2<<log_2[i/2])==i);
        }
    }
    for(int len=1;len<=log_2[n];len++){
        for(int i=1;i<=n;++i){
            maxn[i][len] = max(maxn[i][len-1],maxn[min(n,i+(1<<(len-1)))][len-1]);
        }
    }
    // for(int i=1;i<=n;++i){
    //     printf("---%d %d\n",i,log_2[i]);
    // }
    // for(int len=1;len<=log_2[n];len++){
    //     for(int i=1;i<=n;++i){
    //         cout<<maxn[i][len]<<' ';// = max(maxn[i][len-1],maxn[min(n,i+(2<<(len-1)))][len-1]);
    //     }
    //     cout<<"\n";
    // }
    for(int i=1;i<=m;i++){
        qread(l);
        qread(r);
        res = max(maxn[l][log_2[r-l+1]],maxn[r-(1<<log_2[r-l+1])+1][log_2[r-l+1]]);
        printf("%d\n",res);
    }
    return 0;
}